package com.tedu.api.list;

import org.junit.Test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Set接口是Collection接口的子接口
 * Set接口存储数据，特点：无序，无下标，元素不可以重复，
 *                                子实现类：可以存null，也可以不可以存null
 *常用方法：Set 接口的方法继承与Collection 接口
 *        add() remove() contains() size() clear()
 *迭代器：Iterator 进行遍历集合
 * 具体实现类：
 * ①HashSet【常用】：由哈希算法实现保存数据集合！
 *   特点：不保证元素数据，不允许元素重复，可以存null值
 * Set的方法HashSet 方法一致
 * ②LinkedHashSet【偶尔用但少】：可以存null、不可以存重复元素、可以保证元素的插入顺序
 * ③TreeSet【基本不用】：不允许元素重复、不可以存null值、保证元素顺序
 *                      比较器对元素排序
 */
public class SetAPI {
    @Test
    public void testSet(){
        //创建Set集合----多态方式---保证数据的唯一性
        Set<String> set=new HashSet<>();
        //add()   父类Set方法 | 子类HashSet add() ----调用子类的重写方法
        set.add(new String("蒸鹿尾儿"));
        set.add(new String("烧花鸭"));
        set.add(new String("烧雏鸡"));
        set.add(new String("烧子鹅"));
        set.add(new String("烧子鹅"));
        set.add(null);set.add(null);
        //null：所有引用方式的默认值
        System.out.println("Set集合的打印:"+set);
        //remove方法---重写与Collection
        set.remove("烧子鹅");  //返回值：boolean
        System.out.println("删除Set集合中的元素："+set);
        boolean b=set.contains("烧子鹅");
        System.out.println("判断元素是否存在set集合中"+b);
        System.out.println("Set集合元素个数"+set.size());
        /*set.clear();
        System.out.println("是否清空set集合："+set);*/
        //使用Iterator  遍历Set集合数据
        //1.通过set集合调取iterator() 返回：Iterator实例【迭代器对象】
       Iterator<String> it=set.iterator();
        //2.遵循迭代器使用规则：问、取、删---删除null值
        while(it.hasNext()){//问：集合是否有数据
            String str=it.next(); //取：获取元素
            if(str==null){ //引用类型【对象】：null值
                it.remove(); //删
            }
        }
        //3.迭代器中打印元素：数据
        System.out.println("Set集合打印元素："+set);
    }
}
